Thinking in java 学习笔记(2)之final关键字

final关键字用法

  1. 一个永不改变的编译时常量。
  2. 一个在运行时被初始化的值,而你不希望他改变。
  3. final使引用恒定不变,一旦引用被初始化指向一个对象,就无法再改变它指向另一个对象,然而,对象其自身却是可以被修改的。

空白final

  • 空白final:被声明为final但又未给定初值的域。
  • 必须在域的定义处或者每个构造器中用表达式对final进行赋值。

final参数

  • 无法再方法中更改参数引用所指向的对象。
  • 当基本类型的参数被指明为final时,你可以读取参数,却无法修改参数。

final方法

  • 防止任何继承类修改它的含义。
  • 类中所有private方法都是隐式指定为final的。

static+final+继承与初始化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public class Insect {
private int i = 9;
protected int j;
Insect(){
System.out.println("i ="+i+" j="+j);
j = 39;
}
private static int x1 = printInit("Insect.x1 initialized");
static int printInit(String s){
System.out.println(s);
return 47;
}
}

public class Beetle extends Insect {
private int k = printInit("Beetle.k initialized");
public Beetle(){
System.out.println("k:"+k);
System.out.println("j"+j);
}
private static int x2 = printInit("static Beetle.x2 initialized");

public static void main(String[] args) {
System.out.println("Beetle constructor");
Beetle b = new Beetle();
}
}

"运行结果"
Insect.x1 initialized
static Beetle.x2 initialized
Beetle constructor
i=9 j=0
Beetle.k initialized
k:47
j:39

初始化顺序:

  1. 基类的static初始化->子类的static初始化
  2. 基类的基本类型与对象引用被设置为初始值->子类的基本类型与对象引用被设置为初始值
  3. 基类的构造器->子类的构造器